//
//  WPNetManager.swift
//  WB
//
//  Created by 汪鹏 on 2016/12/24.
//  Copyright © 2016年 汪鹏. All rights reserved.
//

import UIKit
import AFNetworking


/// 定义请求的类型的枚举常量
enum WPRequestMethod {
    
    case GET
    
    case POST
}

/// 网络管理工具
class WPNetManager: AFHTTPSessionManager {

    /// swift实例化单利的方式
    static let shareManager:WPNetManager = {
        
        let instance = WPNetManager()
        
        // 设置请求的响应类型
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        return instance
    }() // static:静态的  let：常量
    
    // 懒加载用户数据模型
    lazy var userAccount:WPUserAccount = WPUserAccount()
    
    // 记录用户是否登陆过（计算型属性）
    var userLogon:Bool {
        return userAccount.access_token != nil
    }

    /// 专门负责拼接token的函数
    func requestWithToken(method meth:WPRequestMethod = .GET, URLString: String, parameters:Any?, completion:@escaping (_ result: Any?, _ isSuccess: Bool)->()){
        
        
        // 处理token
        guard let token = userAccount.access_token else {
            
            print(#function+"缺少Token，请登陆")
            
            // token缺失，发送通知让用户登陆（本方法不知道谁调用，因该谁接收到通知谁调用）
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: USERSHOULDLOGINNOTIFICATION), object: nil)
            
            completion(nil,false)
            
            return
        }
        
        // 判断parameters是否为空
        var parameters = parameters as? [String:Any]
        
        if parameters == nil {

            // 实例化一个字典
            parameters = [String:Any]()
        }
        
        // 这里的parameters一定不为空
        parameters!["access_token"] = token
        
        request(method: meth, URLString: URLString, parameters: parameters, completion: completion)
    }
    
    
    /// 使用函数封装AFN请求
    ///
    /// - Parameters:
    ///   - meth: GET/POST请求
    ///   - URLString: 路径
    ///   - parameters: 参数
    ///   - completion: 请求结果的一个回调
    func request(method meth:WPRequestMethod = .GET, URLString: String, parameters:Any?, completion:@escaping (_ result: Any?, _ isSuccess: Bool)->()){
        
        // 成功的回调
        let success = { (task:URLSessionDataTask, json:Any?) -> () in
        
            completion(json, true)
        }
        // 失败的回调
        let failure = { (task:URLSessionDataTask?, error:Error) -> () in
            
            print(#function+"request放法请求失败")
            
            // 针对code=403，处理token过期
            let task = task?.response as? HTTPURLResponse
            
            if task?.statusCode == 403 {
                
                print(#function+"request放法请求token失效")
                
                // FIXME:-- token失效，发送通知提示用户再次登陆（本方法不知道谁调用，因该谁接收到通知谁调用）
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: USERSHOULDLOGINNOTIFICATION), object: "bad token")
                
            }
            
            completion(error, false)
        }
        
        // 请求的开始
        if meth == .GET {
            
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
            
        }else{
            
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
    }
}
